import getLastEvent from "../utils/getLastEvent";
import getSelector from "../utils/getSelector";
export function injectJsError() {
  window.addEventListener("error", function (event) {
    let lastEvent = getLastEvent(); // 最后一个交互事件
    // 这个一个脚本加载错误
    if (event.target && (event.target.src || event.target.href)) {
      tracker.send({
        kind: "stability", // 监控指标的大类
        type: "error", // 小类型，这个一个错误
        errorType: "resourceError", // js执行错误
        message: event.message, // 错误信息
        filename: event.filename, // 错误文件名
        tagName: event.target.tagName, // 错误发生的元素标签名
        selector: getSelector(event.target), // 最后一个交互事件的元素});
      });
    } else {
      tracker.send({
        kind: "stability", // 监控指标的大类
        type: "error", // 小类型，这个一个错误
        errorType: "jsError", // js执行错误
        url: "", //错误路径
        message: event.message, // 错误信息
        filename: event.filename, // 错误文件名
        position: event.lineno + ":" + event.colno, // 错误位置
        stack: getLines(event.error.stack), // 错误堆栈
        selector: lastEvent
          ? getSelector(lastEvent.path || lastEvent.target)
          : "", // 最后一个交互事件的元素});
      });
    }
  });

  window.addEventListener("unhandledrejection", function (event) {
    let lastEvent = getLastEvent(); // 最后一个交互事件
    let message;
    let filename;
    let line = 0;
    let column = 0;
    let stack = "";
    let reason = event.reason;
    if (typeof reason === "string") {
      message = reason;
    } else if (typeof reason === "object") {
      if (reason.stack) {
        let matchResult = reason.stack.match(/at\s+(.+):(\d+):(\d+)/);
        filename = matchResult[1];
        line = matchResult[2];
        column = matchResult[3];
      }
      message = reason.stack.message;
      stack = getLines(reason.stack);
    }
    tracer.send({
      kind: "stability", // 监控指标的大类
      type: "error", // 小类型，这个一个错误
      errorType: "promiseError", // js执行错误
      message, // 错误信息
      filename, // 错误文件名
      position: `${line}: ${column}`, // 错误位置
      stack, // 错误堆栈
      selector: lastEvent ? getSelector(lastEvent.path) : "", // 最后一个交互事件的元素
    });
  });

  function getLines(stack) {
    return stack
      .split("\n")
      .slice(1)
      .map((item) => item.replace(/^\s+at\s+/g, ""))
      .join("^");
  }
}
